package v1ch05.methods;

import java.lang.reflect.Method;

/**
 * 该程序显示了如何通过反射调用方法。
 *
 * @author Cay Horstmann
 * @version 1.2 2012-05-04
 */
public class MethodTableTest {
	public static void main(String[] args) throws Exception {
		//获取指向square和sqrt方法的方法指针
		Method square = MethodTableTest.class.getMethod("square", double.class);
		Method sqrt = Math.class.getMethod("sqrt", double.class);
		
		//打印x和y值表
		
		printTable(1, 10, 10, square);
		printTable(1, 10, 10, sqrt);
	}
	
	/**
	 * 返回数字的平方
	 *
	 * @param x a number
	 * @return x squared
	 */
	public static double square(double x) {
		return x * x;
	}
	
	/**
	 * 打印具有方法的x和y值的表
	 *
	 * @param from x值的下限
	 * @param to   x值的上限
	 * @param n    表中的行数
	 * @param f    具有双参数和双返回值的方法
	 */
	public static void printTable(double from, double to, int n, Method f) {
		//打印该方法作为表头
		System.out.println(f);
		
		double dx = (to - from) / (n - 1);
		
		for (double x = from; x <= to; x += dx) {
			try {
				double y = (Double) f.invoke(null, x);
				System.out.printf("%10.4f | %10.4f%n", x, y);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
